package com.own.component.store.redis.method;

import com.own.component.store.core.method.StoreList;
import org.redisson.api.RedissonClient;

import java.util.List;

/**
 * DefaultRedisStoreList
 *
 * @author chenxueli
 * @date 2022-06-15 03:14:15
 */
public class DefaultRedisStoreList<T> extends DefaultBaseStoreMethod implements StoreList<T> {

    public DefaultRedisStoreList(RedissonClient redissonClient) {
        super(redissonClient);
    }

    /**
     * 获取整个列表
     *
     * @param name 唯一key
     * @return 列表
     */
    @Override
    public List<T> get(String name) {
        return getRedissonClient().<T>getList(buildKey(name)).readAll();
    }

    /**
     * 获取子集
     *
     * @param name  唯一key
     * @param start 开始位置
     * @param end   结束位置
     * @return 列表
     */
    @Override
    public List<T> range(String name, long start, long end) {
        return getRedissonClient().<T>getList(buildKey(name)).range((int) start, (int) end);
    }

    /**
     * 根据索引获取值
     *
     * @param name  唯一key
     * @param index 索引
     * @return 值
     */
    @Override
    public T index(String name, long index) {
        return getRedissonClient().<T>getList(buildKey(name)).get((int) index);
    }

    /**
     * 获取最左侧的值
     *
     * @param name 唯一key
     * @return 值
     */
    @Override
    public T leftPop(String name) {
        return getRedissonClient().<T>getDeque(buildKey(name)).pollFirst();
    }

    /**
     * 获取最右侧的值
     *
     * @param name 唯一key
     * @return 值
     */
    @Override
    public T rightPop(String name) {
        return getRedissonClient().<T>getDeque(buildKey(name)).pollLast();
    }

    /**
     * 设置值
     *
     * @param name  唯一key
     * @param index 位置
     * @param value 值
     */
    @Override
    public void set(String name, int index, T value) {
        getRedissonClient().<T>getList(buildKey(name)).set(index, value);
    }

    /**
     * 插入值
     *
     * @param name  唯一key
     * @param value 值
     */
    @Override
    public void add(String name, T value) {
        getRedissonClient().<T>getList(buildKey(name)).add(value);
    }

    /**
     * 插入值
     *
     * @param name   唯一key
     * @param values 值列表
     */
    @SafeVarargs
    @Override
    public final void add(String name, T... values) {
        getRedissonClient().<T>getList(buildKey(name)).addAll(List.of(values));
    }

    /**
     * 右侧插入值
     *
     * @param name  唯一key
     * @param value 值
     */
    @Override
    public void rightAdd(String name, T value) {
        getRedissonClient().<T>getDeque(buildKey(name)).addLast(value);
    }

    /**
     * 右侧插入值
     *
     * @param name   唯一key
     * @param values 值列表
     */
    @SafeVarargs
    @Override
    public final void rightAdd(String name, T... values) {
        getRedissonClient().<T>getDeque(buildKey(name)).addAll(List.of(values));
    }

    /**
     * 是否包含
     *
     * @param name  唯一key
     * @param value 值
     * @return 是否包含
     */
    @Override
    public boolean contains(String name, T value) {
        return getRedissonClient().<T>getList(buildKey(name)).contains(value);
    }

    /**
     * 根据索引移除
     *
     * @param name  唯一key
     * @param index 索引
     */
    @Override
    public void remove(String name, int index) {
        getRedissonClient().<T>getList(buildKey(name)).remove(index);
    }

    /**
     * 根据值移除左侧第一个匹配的值
     *
     * @param name  唯一key
     * @param value 值
     */
    @Override
    public void remove(String name, T value) {
        getRedissonClient().<T>getList(buildKey(name)).remove(value);
    }

}
